package com.briup.bms.common.utils;

import com.briup.bms.bean.Employee;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

/**
 * jwt操作的工具类。
 * 服务器端的jwt操作工具类：
 * 1. 生成令牌 :
 * 当用户认证成功以后，需要生成令牌，发放给用户
 * 2.验证令牌
 * 当用户发送其他请求时，都需要进行令牌校验。
 *
 * @author guomiao
 */
public class JWTUtils {
    private static final SignatureAlgorithm sg = SignatureAlgorithm.HS256;
    private static final long exp = 48 * 60 * 60 * 1000;
    private static final String secret = "bms-zhengqg-xxx";

    /**
     * 生成令牌
     *
     * @return
     * @author guomiao
     */
    public static String generateJWT(Employee emp) {
        JwtBuilder jwtBuilder = Jwts.builder();
        //1. 定义令牌头部，使用Base64URLEncode
        jwtBuilder.setHeaderParam("alg", sg.getValue());
        jwtBuilder.setHeaderParam("typ", "jwt");

        //2. 定义令牌荷载，添加一些和用户相关的信息,一定不要添加敏感信息。使用Base64URLEncode
        Date now = new Date();
        Date expDate = new Date(System.currentTimeMillis() + exp);
        jwtBuilder.claim("userId", emp.getUserId())
                .claim("title", emp.getTitle())
                .claim("username", emp.getUsername())
                .setIssuedAt(new Date()).setExpiration(expDate);
        //3. 生成签名。 头部指定算法((头部Base64字符串+"."+荷载Base64字符串),密钥)
        jwtBuilder.signWith(sg, secret.getBytes());
        return jwtBuilder.compact();
    }

    /*
     * 解析令牌
     */
    private static Claims parseJWT(String token) {
        return Jwts.parser().setSigningKey(secret.getBytes()).parseClaimsJws(token)
                .getBody();
    }

    public static String getUserId(String token) {
        return parseJWT(token).get("userId", String.class);
    }

    public static String getUsername(String token) {
        return parseJWT(token).get("username", String.class);
    }

    public static String getTitle(String token) {
        return parseJWT(token).get("title", String.class);
    }

//
//	public static void main(String[] args) {
//		Employee emp = new Employee();
//		emp.setUserId("zhangsan");
//		emp.setUsername("xxx");
//		emp.setTitle("VP");
//		String token = generateJWT(emp);
//		System.out.println("token:"+token);
//		System.out.println("1------------------------------");
//		Claims cs = parseJWT(token);
//		System.out.println(cs.getIssuedAt());
//		System.out.println("username:"+cs.get("username"));
//		System.out.println("userId - "+cs.get("userId", String.class));
//		System.out.println("2------------------------------");
//		System.out.println(getTitle(token));
//	}
}
